package com.yonyou.pmclouds.outter.enterprise;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.yonyou.pmclouds.basecom.exception.BusinessException;
import com.yonyou.pmclouds.enterprise.entity.EnterpriseInfo;
import com.yonyou.yht.sdk.EnterpriseCenter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * <b>本类主要完成以下功能：与企业有关的操作方法</b>
 *
 * @author zhangwce
 * @version pm_cloud
 * @time 2018年1月25日 下午9:38:00
 */
@Slf4j
@Component
public class EnterpriseOperator {

    @Autowired
    private EnterpriseInfoQuery enterpriseInfoQuery;

    private ObjectMapper objectMapper;

    public EnterpriseOperator() {
        objectMapper = new ObjectMapper();
    }

    /**
     * 方法功能描述：将用户加入企业。如已经加入过，则不再重复加入。
     * 本来将用户加入企业的方法内部会校验，但是由于友户通没有异常码，只有异常信息。
     * 根据异常信息校验是否重复加入不太靠谱（异常信息有可能友户通会修改），所以手动访问一遍确认是否已经加入
     * <b>参数说明</b>
     *
     * @param userId
     * @param pk_enterprise
     * @throws BusinessException
     * @author zhangwce
     * @time 2018年1月30日 上午10:15:01
     */
    public void userApplyJoinEnter(String userId, String pk_enterprise) throws BusinessException {

        if (StringUtils.isEmpty(userId) || StringUtils.isEmpty(pk_enterprise)) {
            log.error("用户或者租户为空，userId为：" + userId + "，企业Id为：" + pk_enterprise);
            return;
        }

        if (checkRepeatJoin(userId, pk_enterprise))
            return;

        Map<String, Object> resultMap = new HashMap<String, Object>();
        Date beginDate = new Date();
        // 将用户加入到企业
        String result = EnterpriseCenter.UserApplyJoinEnter(userId, pk_enterprise);
        if (StringUtils.isEmpty(result)){
            log.error("用户加入体验企业报错：访问友户通接口异常");
            throw new BusinessException("用户加入到体验企业出错");
        }
        log.error("访问友户通接口，加入企业耗时：" + (new Date().getTime() - beginDate.getTime()));
        try {
            resultMap = objectMapper.readValue(result, Map.class);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        if (Integer.valueOf(0).equals(resultMap.get("status"))) {
            log.error("将用户加入到体验企业出错;用户ID为" + userId + ",企业ID为" + pk_enterprise + ",具体错误信息为："
                    + resultMap.get("msg"));

            throw new BusinessException("用户加入到体验企业出错");
        }

    }

    /**
     * 方法功能描述：检查用户是否重复加入该企业。
     * <p>
     * <b>参数说明</b>
     *
     * @param userId
     * @param pk_enterprise
     * @return
     * @author zhangwce
     * @time 2018年1月30日 上午10:14:13
     */
    private boolean checkRepeatJoin(String userId, String pk_enterprise) {
        EnterpriseInfo[] enterInfos = enterpriseInfoQuery.getEnterprisesOfUser(userId);
        boolean flag = false;
        if (enterInfos == null)
            return false;
        for (EnterpriseInfo enterpriseInfo : enterInfos) {
            if (pk_enterprise.equals(enterpriseInfo.getId())) {
                flag = true;
                break;
            }
        }
        return flag;
    }


}
